#include "Block.h"
#include "Signals.h"

// downloading data methods
/**************************************************************************************************************/
void Block :: startDownloading(int slave_id) {
    MPI_Request untracked_request;
    MPI_Isend(&id, 1, MPI_INT, slave_id, Signals :: SEND_ME_BLOCK,
        MPI_COMM_WORLD, &untracked_request);
    MPI_Irecv(getRawDataBuffer(), getRawDataSize(), getDataType(), slave_id,
        Signals :: BLOCK_DATA, MPI_COMM_WORLD, &request);
}

void Block :: waitForDownloadCompletion() {
    MPI_Wait(&request, &status);
}

bool Block :: isDownloaded() {
    MPI_Test(&request, &flag, &status);
    return flag;
}
/**************************************************************************************************************/


// sending data method(s)
/**************************************************************************************************************/
void Block :: sendDataTo(int slave_id) {
    MPI_Request untracked_request;
    MPI_Isend(getRawDataBuffer(), getRawDataSize(), getDataType(), 
        slave_id, Signals :: BLOCK_DATA, MPI_COMM_WORLD, &untracked_request);
}
/**************************************************************************************************************/
